#include<queue>
#include<iostream>
#include<vector>
using namespace std;
struct edge{
    int x;
    int y;
    int v;
};
bool bj[2000];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pq;
vector<edge>e[2000];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        edge c;
        c.x=n;
        c.y=i;
        c.v=x;
        e[n].push_back(c);
        pq.push(make_pair(x,i));
    }
    bj[n]=1;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        edge eg;
        eg.x=x;
        eg.y=y;
        eg.v=z;
        e[x].push_back(eg);
        eg.x=y;
        eg.y=x;
        eg.v=z;
        e[y].push_back(eg);
    }
    int sum=0;
    int ans=0;
    while(sum<n&&!pq.empty()){
        pair<int,int> f=pq.top();
        pq.pop();
        if(bj[f.second])continue;
        ans+=f.first;
        bj[f.second]=1;
        sum++;
        for(int i=0;i<e[f.second].size();i++){
            if(!bj[e[f.second][i].y]){
                pq.push(make_pair(e[f.second][i].v,e[f.second][i].y));
            }
        }
    }
    cout<<ans;
    return 0;
}
//prim
//make_pair<int,int>
//选取起点。
//将边加入集合。
//设为标记。
//优先队列
//出队，标记，拓展。
//直到全部标记。
//开头有一个选起点问题，即建立一个虚拟节点，建立到其他点的cost